<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <link rel="stylesheet" href="/js/prism.css">
    <link rel="stylesheet" href="/css/app.css">
    <title>Git学习 - 叫兽</title>
    <link rel="icon" type="image/x-icon" class="js-site-favicon" href="/img/favicon.ico">
  </head>
  <body>

        <div class="container bg-white pb-5 px-5 spx-0">
            
            <h1 class="post-title">Git学习</h1>




            <h2>一、 安装</h2><p><code>brew install git </code> or <code>brew upgrade git</code></p><p>安全完成后，需要进行一个用户信息设置：<br /></p><p><code>git config &ndash;global user.name &quot;Your name&quot;</code><br /> <code>git config &ndash;global user.name &quot;email@exapmpe.com&quot;</code></p><h2>二、Git操作</h2><p>git add filename 添加某个文件的版本控制</p><p>git add . 添加当前所有文件的版本控制</p><p>git diff 或者 git diff readme.txt 用来查看修改了某个文件的哪些地方。</p><p>git log 查看最近到最远的提交日志。也可以使用 git log &ndash;pretty=oneline 简化显示信息</p><p>git 使用HEAD表示当前版本， 上一个版本就是HEAD^，上上一个版本就是HEAD^^，再往上100个版本就是HEAD~100，如果我们要把当前版本回退到上一个版本，就可以使用git reset命令：git reset命令在切换版本的同时，会把暂存区和工作区的内容全部清空</p><p><code>git reset &ndash;hard HEAD&#126;1</code></p><p>git reflog用来记录你的每一次命令</p><p>然后查看之前的版本 id，然后回退到那个版本</p><p>git reset &ndash;hard a422082</p><p>把一个文件变为未修改的样子 <code>git checkout &ndash; hello.rb</code></p><p>git commit只负责把暂存区的修改提交到版本库</p><p>git diff HEAD &ndash; readme.txt 命令可以查看工作区和版本库里面最新版本的区别：或者是暂存区和版本库里最新版本的区别，如果暂存区和当前工作区都做了修改，那么会把所有的diff都显示出来</p><p>git diff HEAD faa7d5ebc5ff1fd7fb919376ad9e0ce70983df9e 版本库里的最新版本和指定版本的比较</p><h2>撤销修改</h2><h3>撤销工作区的修改</h3><p>git checkout &ndash; file 把工作区的修改过的文件回退到最近一次add的状态，就是把当前修改全部撤销回未修改状态。如果已经 add 了，则无效</p><h3>撤销暂存区的修改</h3><p>git reset HEAD readme.txt 把暂存区的内容撤销退回工作区，如果文件在 add 到暂存区后，又进行了修改，那么撤回的时候以工作区的数据为准，git reset HEAD readme.txt做的事情就是：相当于没有add过。</p><p>git reset HEAD 撤销当前所有暂存区的文件,撤回工作区</p><h2>删除文件</h2><p>git rm filename 把文件从版本库中删除</p><p>rm 不小心删除了文件, 可以用git checkout &ndash; filename来恢复该文件(从最新版本库中回复该文件出来)</p><h2>远程仓库</h2><p>git remote add origin git@bitbucket.org:xiaomizha/learngit.git 如果配置了多个public key，需要改一下这个地址</p><p>git push -u origin master 这个命令将本地的master分支推送到origin主机，同时指定origin为默认主机，后面就可以不加任何参数使用git push了。</p><p>git push origin dev  推送 dev 分支到远程库</p><p>git checkout -b dev origin/dev 创建远程origin的dev分支到本地，于是他用这个命令创建本地dev分支：</p><p>git remote -v 查看远程库信息 </p><p>在本地创建和远程分支对应的分支，使用git checkout -b branch-name origin/branch-name，本地和远程分支的名称最好一致；</p><p>建立本地分支和远程分支的关联，使用git branch &ndash;set-upstream branch-name origin/branch-name；</p><h2>分支管理</h2><p>可以使用分支完成某个任务，完成后在这个任务后，在合并到开发分支，然后删除掉这个分支。 分支切换的时候，工作区和暂存区的内容是不会改变的，会一直保留着,所以要注意</p><h3>创建分支</h3><p>git branch dev</p><h3>切换分支</h3><p>git checkout dev</p><h3>创建并切换分支</h3><p>git checkout -b dev</p><p>要从哪个分支拷贝一份代码，就去哪一个分支里面创建分支</p><h3>查看当前分支</h3><p>git branch</p><h3>删除分支</h3><p>git branch -d dev 删除分支dev</p><p>git branch -D dev 强制删除分支dev</p><h3>合并分支</h3><p>git merge dev 切换到master分支，然后 执行 git merge dev 就会把dev 版本合并到master分支上</p><p>Fast-forward合并，Git告诉我们，这次合并是“快进模式”，也就是直接把master指向dev的当前提交，所以合并速度非常快。</p><p>合并分支时，加上&ndash;no-ff参数就可以用普通模式合并，合并后的历史有分支，能看出来曾经做过合并，而fast forward合并就看不出来曾经做过合并。</p><h3>合并冲突</h3><p>git merge feature1 合并如果冲突，会把冲突部分都列出来，====上面的是当前的，====下面的是 merge from的版本。解决掉后，提交就可以了。</p><p>git log &ndash;graph &ndash;pretty=oneline &ndash;abbrev-commit 显示分支合并情况，也可以简写为 git log &ndash;graph，不过这样显示的信息比较多一些。</p><p>git merge dev &ndash;no-ff -m "merge from dev" 从 merge 分支合并过来，并且经用Fast forward模式</p><h3>bug 分支, 存储暂存区</h3><p>git stash 把当前暂存区中的内容储藏起来，然后可以干其它工作，进行其他的提交 </p><p>git stash list 查看当前存储区的列表</p><p>git stash apply 回复最新一个存储区到暂存区，（不会删除）</p><p>git stash apply stash@{0} 指定恢复第几个存储区</p><p>git stash drop 删除最新一个存储区</p><p>git stash pop 弹出最新一个存储区（直接删除了最新一个存储区）</p>
            <p class="text-left text-muted">2018-04-15 04:56</p>
        </div>
        <div class="container">
            <div class="row mt-4">
                <div class="col-6 text-left"><a href="/p/2018/4/8/first-post-from-alog/">上一篇: 我为什么要重复造轮子?</a></div>
                <div class="col-6 text-right"><a href="/p/2018/1/12/English_Words/">下一篇:新的英文单词</a></div>
            </div>
        </div>

        <button class="btn btn-link m-menu-toggle d-md-none fixed-top collapsed" type="button" data-toggle="collapse" data-target="#m-menu" aria-controls="m-menu" aria-expanded="false" aria-label="Toggle docs navigation"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" width="30" height="30" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M4 7h22M4 15h22M4 23h22"></path></svg>
        </button>
        <ul class="nav flex-column collapse fixed-top site-menu d-md-block" id="m-menu">
            <li class="nav-item">
                <a class="nav-link" href="/">首页</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/list/">所有文章</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="/p/about-me/">关于我</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="https://github.com/arlicle">Github</a>
          </li>
        </ul>

        
    <div class="container mt-5">
        <h3>留言</h3>
        <div id="commentApp"></div>
    </div>
    <script>
        var AL_configs = {
            "post_id":"/p/2018/1/31/Git-learn/",
            "appid":"847e226e8a46f64045d45312245a68ba1368a564"
        };
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://comment.debugmyself.com/sc.js";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>


        <footer class="footer mt-5 pb-2">
        <div class="container text-center">
          
          <p><span class="text-black-50">Powered by <a href="https://github.com/arlicle/ablog">ablog</a> © 2019 叫兽</span></p>
          <p><span class="text-black-50"><a href="http://www.beian.miit.gov.cn/">滇ICP备10201832号-3</a></span></p>
          
        </div>
        </footer>
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
        <script src="/js/prism.js"></script>
        <script>
        $(function () {
            $('[data-toggle="tooltip"]').tooltip();
        })
        </script>
        <script type="text/x-mathjax-config">
        MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}, displayAlign: "left",scale: 180});
        </script>
        <script type="text/javascript" async
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_SVG" async>
        </script>
  </body>
</html>